Sumo Logic – CrowdStrike の脅威情報と突合させるクエリについて
Sumo Logic では、CrowdStrike の脅威データを Sumo Logic の DB に取り込んでいます。その脅威データとログデータを突合させて検索することで、悪意のある攻撃を検出することが出来ます。こうした脅威情報の利用方法は大きく分けて2つございます。
1つがダッシュボードを作成して脅威やその傾向を知ることです、こちらは過去にブログ化しております。 Sumo Logic – CrowdStrike の脅威検出ダッシュボードを作成してみた | DevelopersIO
そして、今回は上記の仕組みに迫る部分で2つ目の利用方法として、実際のクエリがどのように作成されているのかをご説明していきます。
threatip 演算子と lookup 演算子を使った脅威情報の検索
クエリでの脅威情報の検索方法は2つあります。
1つ目が、threatip 演算子を使用することです。こちらは、CrowdStrike の脅威情報を活用するのに一番簡単な方法でして、悪意のある攻撃者や団体がよく利用する ip アドレスがログに含まれていないかを検索できます。
2つ目が、lookup 演算子を使用することです。こちらは、Sumo Logic が保有している CrowdStrike の脅威情報のすべてを活用して、悪意のある IPアドレス、URL、ドメイン、ハッシュ 256、および電子メールにマッチする情報を検索できます。
1つずつクエリの書き方を見ていきます。
threatip 演算子の使い方
threatip という演算子に ipアドレスが入っているフィールドを引数として付与します。
構文
| threatip "ipアドレスのフィールド"
これにより出力されるデータは以下の通りです。
- actor
- malicious_confidence
- raw_threat
- type
攻撃団体名
※ Unassigned は脅威に該当するが、攻撃団体名が不明、もしくはまだアサインされてない。
重要度
Ip アドレスがどの部分のログに含まれているのかを表示
threatip 演算子では ip_address と表示
それでは、具体的にデモ環境で検索して出力結果を見てみます。
検索クエリの内容
_sourceCategory=Labs/Apache/Access | parse regex "(?<ip_address>\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})" | threatip ip_address | where !(isNull(malicious_confidence)) | count by ip_address, type, actor, malicious_confidence
1行目:Apache Web サーバのアクセスログを対象に検索
2行目:parse 演算子にオプションの regex を付与することで、正規表現 \b\d{1,3} で ip_address フィールドに ip アドレスデータを抽出
3行目:CrowdStrike の脅威情報と ip_address フィールド を突合
4行目:malicious_confidence が Null ではない検索結果を出力。(where 演算子で検索結果をフィルタリング。isNull は malicious_confidence フィールドの文字列が Null かどうかチェック。! により否定形として指定)
5行目:ip_address, type, actor, malicious_confidence で集計
検索結果
これで CrowdStrike の脅威情報に引っかかったログのみが出力されるように検索できます。 もし、この様に検索結果として出力される場合は、攻撃者の痕跡や侵入経路、攻撃の深度を把握するためにドリルダウンや相関分析が必要になります。 いざという時の調査のためにダッシュボードやクエリを使った調査方法の拡充や、検知の為のアラート設定などをしておきたい部分です。
lookup 演算子を使った CrowdStrike 脅威情報の使い方
次に lookup 演算子ですが、こちらは Sumo Logic 内に保存されているルックアップテーブルからデータを探して検索に利用する方法になります。 Sumo Logic に保存されているルックアップテーブルの1つに CrowdStrike の脅威情報があり、このデータをログと突合させて検索をします。
構文
| lookup "ルックアップテーブルから抽出するフィールド名" from "ルックアップテーブル名" on "照合先のルックアップテーブルのフィールド名"="照合元のログのフィールド名"
これにより出力されるデータは以下の通りです。(threatip 演算子とは一部、異なって出力されます。)
- actor
- threatlevel
- raw
- type
- threat
攻撃団体名
※ Unassigned は脅威に該当するが、攻撃団体名が不明、もしくはまだアサインされてない。
重要度 ※ Unverified は重要度が不明、もしくはまだアサインされてない。
脅威に該当する情報がログのどの部分に含まれているのかを表示
ip_address、domain、email_address、hash_sha256、url と表示
上記、typeに属する ip アドレスや url などのベースとなる脅威情報
それでは、具体的にデモ環境で検索して出力結果を見てみます。
検索クエリの内容
_sourceCategory=Labs/TravelApp | parse regex "(?<email_address>[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[a-zA-Z]{2,4})" | lookup type, actor, threatlevel from sumo://threat/cs on threat=email_address | where !(isNull(threatlevel)) | count by email_address, type, actor, threatlevel
1 ~ 2行目:先ほどと同義です。parse regex の正規表現とフィールド名は E-mail アドレス用に変更してあります。
3行目:ルックアップテーブルから抽出するフィールド名は type, actor, threatlevel を指定。ルックアップテーブル名は sumo://threat/cs で CrowdStrike のテーブルを指定。threat=email_address で threat というルックアップテーブルのメールアドレスがログから抽出した email_address フィールドと一致するかを確認。
4行目:threatlevel が Null ではない検索結果を出力。(where 演算子で検索結果をフィルタリング。isNull は threatlevel フィールドの文字列が Null かどうかチェック。! により否定形として指定)
5行目:email_address, type, actor, threatlevel で集計
検索結果
この様に actor はアサインされていないと出力されないため、threatlevel(重要度)を where でフィルタリングするとよいです。 また、攻撃者側も防御者側と同様に threatlevel を気にしているため、ip アドレスやメールアドレスなどを変更することは十分考えられるため、threatlevel が Medium や Low で表示されていても確認いただくことを推奨します。
以下、各種正規表現を記載しますので用途に応じてご利用ください。
// ip_address | parse regex "(?<ip_address>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})" // url | parse regex "(?<url>(?:http(?:s)?:\/\/.)?(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b(?:[-a-zA-Z0-9@:%_\+.~#?&//=]*))" // email_address | parse regex "(?<email_address>[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[a-zA-Z]{2,4})" // hash_256 | parse regex "(?<hash_256>\b[A-Fa-f0-9]{64}\b)" // domain | parse regex "(?<domain>\b[a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3}\b)"
※ json 形式のログの場合は Auto ParseMode が利くため、上記は不要です。
まとめ
今回は、Sumo Logic で検出できる CrowdStrike の脅威情報を使ったクエリの書き方についてご紹介しました!他にもセキュリティ系の製品(EDR や WAF、DLP、etc..)で脅威を検知している場合は同じようにログを検索できるクエリやダッシュボードによる可視化を行っておくことで攻撃の痕跡の追跡能力が向上し、調査方法も明確になります。
以上、皆様の一助になれば幸いです。